﻿using Microsoft.Extensions.Logging;
using SqlSugar;
using WMS.Repository.IRepository;

/// <summary>
/// 工作单元（事务）
/// </summary>
public class UnitOfWork : IUnitOfWork
{
    private readonly ISqlSugarClient _db;
    private readonly ILogger<UnitOfWork> _logger;

    public UnitOfWork(ISqlSugarClient db, ILogger<UnitOfWork> logger)
    {
        _db = db;
        _logger = logger;
    }

    public async Task<(bool Success, string Message)> ExecuteTransactionAsync(Func<Task> action, string errorMessage = "事务执行失败")
    {
        _logger.LogInformation($"开始执行事务操作");

        try
        {
            // 使用 SqlSugar 内置的事务管理
            var result = await _db.Ado.UseTranAsync(async () =>
            {
                _logger.LogDebug($"事务操作开始执行");
                await action();
                _logger.LogDebug($"事务操作执行完成");
            });

            if (result.IsSuccess)
            {
                _logger.LogInformation($"事务执行成功");
                return (true, "操作成功");
            }
            else
            {
                _logger.LogError($"事务执行失败: {result.ErrorMessage}");
                return (false, $"{errorMessage}: {result.ErrorMessage}");
            }
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, $"事务执行异常: {ex.Message}");
            return (false, $"{errorMessage}: {ex.Message}");
        }
    }

    /// <summary>
    /// 执行事务操作并返回结果
    /// </summary>
    public async Task<(bool Success, T Result, string Message)> ExecuteTransactionAsync<T>(Func<Task<T>> action, string errorMessage = "事务执行失败")
    {
        _logger.LogInformation($"开始执行带返回结果的事务操作");

        try
        {
            var result = await _db.Ado.UseTranAsync(async () =>
            {
                _logger.LogDebug($"带返回结果的事务操作开始执行");
                return await action();
            });

            if (result.IsSuccess)
            {
                _logger.LogInformation($"带返回结果的事务执行成功");
                return (true, result.Data, "操作成功");
            }
            else
            {
                _logger.LogError($"带返回结果的事务执行失败: {result.ErrorMessage}");
                return (false, default(T), $"{errorMessage}: {result.ErrorMessage}");
            }
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, $"带返回结果的事务执行异常: {ex.Message}");
            return (false, default(T), $"{errorMessage}: {ex.Message}");
        }
    }
}